//
//  FHUserAccountViewModel.swift
//  FHweibo
//
//  Created by 张嵩雷 on 16/4/11.
//  Copyright © 2016年 feng. All rights reserved.
//

import UIKit

/// 专门处理 HMUserAccount 模型的相关操作,网络请求,字典转模型,归档,解档
class FHUserAccountViewModel: NSObject {

    //单例
    static let sharedInstance = FHUserAccountViewModel()
    
    private override init() {
        super.init()
        // 单例的init只执行一次
        // 加载账号
        userAccount = loadUserAccount()
    }
    
    ///账号模型,只要拿到单例就可以访问到,全局通用
    var userAccount: FHUserAccount?
    
    ///用户是否登录
    var userLogin: Bool {
        get {
            return userAccount != nil
        }
    }
    
    ///MARK: 获取accessToken
    //1.定义闭包类型,通过函数的参数传递
    func loadAccessToken(code: String,loadAccessTokenCallback: (error:NSError?)->()) {
        //1.urlString
        let urlString = accessTokenURLString
        
        //2.参数,字典
        let parameters = [
            "client_id":client_id,
            "client_secret":client_secret,
            "grant_type":grant_type,
            "code":code,
            "redirect_uri":redirect_uri
        ]
        
        ///发送请求, AFN.POST
        FHNetworkTool.sharedInstance.POST(urlString, parameters: parameters, progress: nil, success: { (task, responseObject) -> Void in
            
            // as: 表示类型转换
            // as?: 有可能转成功,有可能转失败
            // as!: 一定能转成成功,如果转换失败,直接挂了
            let result = responseObject as? [String: AnyObject]
            
            if let dict = result {
                //字典转模型
                self.userAccount = FHUserAccount(dict: dict)
//                FHPrint("字典转模型成功:\(userAccount)")
                
                self.saveUseAccount()
                //2.通知控制器账号加载完成了,调用闭包
                loadAccessTokenCallback(error: nil)
            }
            
            }) { (task, error) -> Void in
                
                loadAccessTokenCallback(error: error)
        }
        
    }
    
    ///保存账号模型
    private func saveUseAccount() {
//        FHPrint("accountPah: \(accountPath)")
        
        if let userAccount = self.userAccount {
            //归档
            NSKeyedArchiver.archiveRootObject(userAccount, toFile: accountPath)
        }
    }
    
    ///从沙盒里面解档UserAccount对象
    func loadUserAccount()->FHUserAccount? {
        
        //解档账号,有可能有,有可能没有
        let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath)as? FHUserAccount
        // 可选绑定, 判断账号是否有值,账号有值,判断是否过期
        // 测试过期时间,
//        userAccount?.expiresDate = NSDate(timeIntervalSinceNow: -100)
        if let account = userAccount where account.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
//            FHPrint("没有过期: \(account)")
            return account
        }
        return nil
        
    }
    
    //MARK: -获取用户信息
    func loadUserInfo(loadUserInfoCallback:(error: NSError?) -> ()) {
        //守卫
        guard let access_token = userAccount?.access_token else {
            //能进来表示,userAccount?没有值,或者access_token没有值
//            FHPrint("userAccount?没有值,或者access_Token没有值")
            
            // domain: 自定义: 表示错误范围
            // code: 自定义: 表示错误类型,一般是以负数开头
            // userInfo: 附加的信息
            //            let e = HMNetworkErrorEnum.AccessTokenEmpty
            //            let error = NSError(domain: "cn.itheima.net", code: e.rawValue, userInfo: ["errorDescription" : e.errorDescription])
            let error = FHNetworkErrorEnum.AccessTokenEmpth.error()
            
            loadUserInfoCallback(error: error)
            
            return
        }
        
        guard let uid = userAccount?.uid else {
            //能进来表示,userAccount?没有值,或者uid没有值
            FHPrint("userAccount?没有值,或者uid没有值")
            
            let error = FHNetworkErrorEnum.UidEmpth.error()
            loadUserInfoCallback(error: error)
            
            return
        }
        
        //url
        let urlString = "https://api.weibo.com/2/users/show.json"
        //参数
        let parameters = [
            "access_token" : access_token,
            "uid" : uid
        ]
        
        //发送请求
        FHNetworkTool.sharedInstance.GET(urlString, parameters: parameters, progress: nil, success: { (task, responseObject) -> Void in
//            
//            FHPrint("加载用户信息成功:\(responseObject)")
            if let dict = responseObject as? [String: AnyObject] {
                //将获取到得数据赋值给当前账号
                self.userAccount?.screen_name = dict["screen_name"] as? String
                self.userAccount?.avatar_large = dict["avatar_large"] as? String
                
                //将当前对象保存到沙盒中
                self.saveUseAccount()
                
                loadUserInfoCallback(error: nil)
            }
            
            }) { (task, error) -> Void in
                
                loadUserInfoCallback(error: error)
        }
        
    }
    
    
}
